"""
递归

递归和循环：
    如果使用循环，程序的性能可能更高；如果使用递归，程序可能更容易理解。
    递归只是让解决方案更清晰，并没有性能上的优势。

栈和调用栈：
    栈是一种简单的数据结构（只有两种操作：压入和弹出）。
    用于存储多个函数的变量的栈，被称为调用栈。

栈的代价：
    存储详尽的信息可能占用大量的内存。

小结：
    1.递归指的是调用自己的函数。
    2.每个递归函数都有两个条件：基线条件（base case）和 递归条件（recursive case）。
    3.栈有两种操作：压入（插入）和弹出（删除并读取）。
    4.所有函数调用都进入调用栈。
    5.调用栈可能很长，这将占用大量的内存。
"""


class ItemObj(object):
    def __init__(self, type_=1):
        # 1：盒子 2：钥匙
        self.type_ = type_
        self.children = []

    def is_a_box(self):
        return self.type_ == 1

    def is_a_key(self):
        return self.type_ == 2

    def add_children(self, child):
        self.children.append(child)


def look_for_key(box):
    for item in box.children:
        if item.is_a_box():
            look_for_key(item)
        elif item.is_a_key():
            print("找到钥匙")


if __name__ == "__main__":
    root = ItemObj(1)

    children1 = ItemObj(1)
    children2 = ItemObj(1)

    children21 = ItemObj(1)
    children22 = ItemObj(2)
    children2.add_children(children21)
    children2.add_children(children22)

    root.add_children(children1)
    root.add_children(children2)

    # 递归找钥匙
    look_for_key(root)
